/*
 * @Author: cooper
 * @Date: 2025-04-02 00:46:28
 * @Wechat: cmd_develop
 * @Description:
 */

#include "mks_hex.h"

/// @brief 设置电机堵转功能
/// @param tx_data
/// @param addr 地址
/// @param fig 1：开启保护 0：关闭保护
/// @return
u8 MKS_Set_Protect_function(u8 *tx_data, u8 const addr, u8 const fig)
{
    u8 i = 0;
    tx_data[i++] = 0xFA;
    tx_data[i++] = addr;
    tx_data[i++] = 0x88;
    if (fig)
    {
        tx_data[i++] = 0x01;
    }
    else
    {
        tx_data[i++] = 0x00;
    }
    tx_data[i] = getCheckSum(tx_data, i);
    return (i + 1);
}

/// @brief 归零
/// @param tx_data 指令指针
/// @param addr 地址
/// @return 指令数量
u8 moto_run_home_function(u8 *tx_data, u8 addr)
{
    u8 i = 0;
    tx_data[i++] = 0xFA;
    tx_data[i++] = addr; // 地址
    tx_data[i++] = 0x91;
    // tx_data[i++] = 0x00;
    tx_data[i++] = getCheckSum(tx_data, i);
    return i;
}

/// @brief 绝对运动
/// @param tx_data 指令指针
/// @param addr 地址
/// @return 指令数量
u8 moto_run_abs_function(u8 *tx_data, u8 addr, u16 speed, u8 acc, u32 absAxis)
{
    u8 i = 0;
    tx_data[i++] = 0xFA;
    tx_data[i++] = addr;
    tx_data[i++] = 0xF4;
    /*速度*/
    tx_data[i++] = (speed >> 8) & 0xff;
    tx_data[i++] = (speed >> 0) & 0xff;
    /*加速度*/
    tx_data[i++] = acc;
    /*绝对坐标*/
    tx_data[i++] = (absAxis >> 24) & 0xff;
    tx_data[i++] = (absAxis >> 16) & 0xff;
    tx_data[i++] = (absAxis >> 8) & 0xff;
    tx_data[i++] = (absAxis >> 0) & 0xff;
    tx_data[i++] = getCheckSum(tx_data, i);
    return i;
}

/// @brief 相对运动
/// @param tx_data 指令指针
/// @param addr 地址
/// @return 指令数量
u8 moto_run_rel_function(u8 *tx_data, u8 addr, u16 speed, u8 acc, u32 relAxis)
{
    u8 i = 0;
    tx_data[i++] = 0xFA;
    tx_data[i++] = addr;
    tx_data[i++] = 0xF5;
    /*速度*/
    tx_data[i++] = (speed >> 8) & 0xff;
    tx_data[i++] = (speed >> 0) & 0xff;
    /*加速度*/
    tx_data[i++] = acc;
    /*绝对坐标*/
    tx_data[i++] = (relAxis >> 24) & 0xff;
    tx_data[i++] = (relAxis >> 16) & 0xff;
    tx_data[i++] = (relAxis >> 8) & 0xff;
    tx_data[i++] = (relAxis >> 0) & 0xff;
    tx_data[i++] = getCheckSum(tx_data, i);
    return i;
}

u8 MKS_Set_GoHone_retValue_function(u8 *tx_data, u8 addr, u32 retValue)
{
    u8 i = 0;
    tx_data[i++] = 0xFA;
    tx_data[i++] = addr; // µØÖ·
    tx_data[i++] = 0x94;
    /*·µ»Ø¾àÀë*/
    tx_data[i++] = (retValue >> 24) & 0xff;
    tx_data[i++] = (retValue >> 16) & 0xff;
    tx_data[i++] = (retValue >> 8) & 0xff;
    tx_data[i++] = (retValue >> 0) & 0xff;
    tx_data[i++] = getCheckSum(tx_data, i);
    return (i);
}

/**
 * @brief  	主机 10 功能码通讯
 * @param1  	发送缓冲区指针
 * @param2  	从机地址
 * @param3  	寄存器地址
 * @param4  	数据总数
 * @param5  	数据地址
 * @retval 	数据长度
 */
u8 MASTER_MODBUS_10_CODE(u8 *const tx_buffer, u8 const slave_addr, u16 const registe_address, u16 data_total)
{
    u16 crc16 = 0;
    u8 len = 0;
    tx_buffer[len++] = slave_addr; // 地址
    tx_buffer[len++] = 0x10;       // 功能
    /* 寄存器地址 */
    tx_buffer[len++] = registe_address / 256;
    tx_buffer[len++] = registe_address % 256;
    /* 数据个数 字节数 */
    tx_buffer[len++] = data_total / 256;
    tx_buffer[len++] = data_total % 256;
    tx_buffer[len++] = data_total * 2;
    /* 数据 */
    for (u8 i = 0; i < data_total; i++)
    {
        tx_buffer[len++] = (u8)(BP_CONFIG[slave_addr * 3 + i].bake_temputure / 256);
        tx_buffer[len++] = (u8)(BP_CONFIG[slave_addr * 3 + i].bake_temputure % 256);
    }
    /* CRC校验 */
    crc16 = usMBCRC16(tx_buffer, data_total * 2 + 7);
    tx_buffer[len++] = crc16 % 256;
    tx_buffer[len++] = crc16 / 256;
    return len;
}
